
/**
 * 无：字段值无校验。
  数：字段值做整数校验。
  手：字段值做手机号码校验。
  电：字段值做电话号码校验。
  邮：字段值做邮箱格式校验。
  身：字段值做身份证格式校验。
  网：字段值做网址格式校验。
  浮：字段值做小数校验。
 */
export let pattern_map = {
  '数': /(^-?\d+$)|(^$)/,
  '手': /^1[3456789]\d{9}$/,
  '电': /^([0-9]{3,4}-)?[0-9]{7,8}$/,
  '邮': /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((.[a-zA-Z0-9_-]{2,3}){1,2})$/,
  '身': /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/,
  '网': /^http[s]?:\/\/.*/,
  '浮': /(^-?[+-]?([0-9]*\.?[0-9]+|[0-9]+\.?[0-9]*)([eE][+-]?[0-9]+)?$)|(^$)/,
}

let message_map = {
  '数': '请输入整数',
  '手': '请输入正确的手机号码',
  '电': '请输入正确的电话',
  '邮': '请输入正确的邮箱',
  '身': '请输入正确的身份证号码',
  '网': '请输入正确的网址',
  '浮': '请输入数字',
}

// 特殊字段：
let pColumnNames = ['pquestion', 'panswer']

// 跨表计算
const crossCalValues = ['角加', '角减', '加', '减']

/**
 * @description 表单的校检规则
 * @returns []
 */
export default function getRule(column) {
  let { isNullable, comments, minLength, maxLength, formatValidation, unique, faceMatch, columnName } = column
  let rules = []

  // 判断是否需要：非空校检 || 字段名是唯一且由用户生成 || 人脸识别功能（一般图像） || 密保问题 || 密保答案 || 跨表计算
  if (isNullable === '否' || unique === '去' || faceMatch === '是' || pColumnNames.includes(columnName) || crossCalValues.includes(column.crossCal)) {
    let ruleItem = {
      required: true,
      message: `请输入${comments}`
    }
    rules.push(ruleItem)
  }

  // 字符串长度校检
  if (minLength || maxLength) {

    rules.push({
      min: parseInt(minLength),
      max: parseInt(maxLength),
      message: `${comments}长度在${minLength}-${maxLength}之间`
    })
  }

  // formatValidation校检
  if (formatValidation && pattern_map[formatValidation]) {
    rules.push({
      pattern: pattern_map[formatValidation],
      message: message_map[formatValidation]
    })
  }

  return rules
}

